做另一面的自己

Chromium 提供判断低端机方法

1
2
3
4
5
6
7
public static boolean isLowEndDevice() {
if(sLowEndDevice == null) {
sLowEndDevice = Boolean.valueOf(detectLowEndDevice());
}
return sLowEndDevice.booleanValue();
}

实现:

1
2
3
4
5
6
7
8
9
10
11
12
private static boolean detectLowEndDevice() {
assert CommandLine.isInitialized();
if(CommandLine.getInstance().hasSwitch("enable-low-end-device-mode")) {
return true;
} else if(CommandLine.getInstance().hasSwitch("disable-low-end-device-mode")) {
return false;
} else {
int ramSizeKB = amountOfPhysicalMemoryKB();
return ramSizeKB > 0 && ramSizeKB / 1024 < 512;
}
}

读取 /proc/meminfo 目录正则匹配出物理内存地址,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private static int amountOfPhysicalMemoryKB() {
Pattern pattern = Pattern.compile("^MemTotal:\\s+([0-9]+) kB$");
ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
try {
FileReader e = new FileReader("/proc/meminfo");
try {
BufferedReader reader = new BufferedReader(e);
try {
while(true) {
String line = reader.readLine();
if(line == null) {
Log.w("SysUtils", "/proc/meminfo lacks a MemTotal entry?");
break;
}
Matcher m = pattern.matcher(line);
if(m.find()) {
int totalMemoryKB = Integer.parseInt(m.group(1));
if(totalMemoryKB > 1024) {
int var7 = totalMemoryKB;
return var7;
}
Log.w("SysUtils", "Invalid /proc/meminfo total size in kB: " + m.group(1));
break;
}
}
} finally {
reader.close();
}
} finally {
e.close();
}
} catch (Exception var25) {
Log.w("SysUtils", "Cannot get total physical size from /proc/meminfo", var25);
} finally {
StrictMode.setThreadPolicy(oldPolicy);
}
return 0;
}